/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controladoresJpa;

import controladoresJpa.exceptions.IllegalOrphanException;
import controladoresJpa.exceptions.NonexistentEntityException;
import controladoresJpa.exceptions.PreexistingEntityException;
import java.io.Serializable;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import model.Relacionamento;
import model.Tabela;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.Persistence;
import model.DicionarioMER;
import model.AssociacaoRelacionamentoAtributo;
import model.ParticipacaoEntidadeRelacionamento;

/**
 * Módulo MER
 * Classe de Entidade do Banco de Dados, gerada automaticamente, porém com certas modificações
 * @author Eduardo, Maylon e Kamilla
 */
public class RelacionamentoJpaController implements Serializable {

    public RelacionamentoJpaController(EntityManagerFactory emf) {
        this.emf = emf;
    }
    private EntityManagerFactory emf = null;
public RelacionamentoJpaController(){
    if(emf==null)
        emf = Persistence.createEntityManagerFactory("unb-gama-threedsPU");
            }
    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(Relacionamento relacionamento) throws PreexistingEntityException, Exception {
        if (relacionamento.getTabelaList() == null) {
            relacionamento.setTabelaList(new ArrayList<Tabela>());
        }
        if (relacionamento.getDicionarioMERList() == null) {
            relacionamento.setDicionarioMERList(new ArrayList<DicionarioMER>());
        }
        if (relacionamento.getAssociacaoRelacionamentoAtributoList() == null) {
            relacionamento.setAssociacaoRelacionamentoAtributoList(new ArrayList<AssociacaoRelacionamentoAtributo>());
        }
        if (relacionamento.getParticipacaoEntidadeRelacionamentoList() == null) {
            relacionamento.setParticipacaoEntidadeRelacionamentoList(new ArrayList<ParticipacaoEntidadeRelacionamento>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            List<Tabela> attachedTabelaList = new ArrayList<Tabela>();
            for (Tabela tabelaListTabelaToAttach : relacionamento.getTabelaList()) {
                tabelaListTabelaToAttach = em.getReference(tabelaListTabelaToAttach.getClass(), tabelaListTabelaToAttach.getNome());
                attachedTabelaList.add(tabelaListTabelaToAttach);
            }
            relacionamento.setTabelaList(attachedTabelaList);
            List<DicionarioMER> attachedDicionarioMERList = new ArrayList<DicionarioMER>();
            for (DicionarioMER dicionarioMERListDicionarioMERToAttach : relacionamento.getDicionarioMERList()) {
                dicionarioMERListDicionarioMERToAttach = em.getReference(dicionarioMERListDicionarioMERToAttach.getClass(), dicionarioMERListDicionarioMERToAttach.getId());
                attachedDicionarioMERList.add(dicionarioMERListDicionarioMERToAttach);
            }
            relacionamento.setDicionarioMERList(attachedDicionarioMERList);
            List<AssociacaoRelacionamentoAtributo> attachedAssociacaoRelacionamentoAtributoList = new ArrayList<AssociacaoRelacionamentoAtributo>();
            for (AssociacaoRelacionamentoAtributo associacaoRelacionamentoAtributoListAssociacaoRelacionamentoAtributoToAttach : relacionamento.getAssociacaoRelacionamentoAtributoList()) {
                associacaoRelacionamentoAtributoListAssociacaoRelacionamentoAtributoToAttach = em.getReference(associacaoRelacionamentoAtributoListAssociacaoRelacionamentoAtributoToAttach.getClass(), associacaoRelacionamentoAtributoListAssociacaoRelacionamentoAtributoToAttach.getCodigo());
                attachedAssociacaoRelacionamentoAtributoList.add(associacaoRelacionamentoAtributoListAssociacaoRelacionamentoAtributoToAttach);
            }
            relacionamento.setAssociacaoRelacionamentoAtributoList(attachedAssociacaoRelacionamentoAtributoList);
            List<ParticipacaoEntidadeRelacionamento> attachedParticipacaoEntidadeRelacionamentoList = new ArrayList<ParticipacaoEntidadeRelacionamento>();
            for (ParticipacaoEntidadeRelacionamento participacaoEntidadeRelacionamentoListParticipacaoEntidadeRelacionamentoToAttach : relacionamento.getParticipacaoEntidadeRelacionamentoList()) {
                participacaoEntidadeRelacionamentoListParticipacaoEntidadeRelacionamentoToAttach = em.getReference(participacaoEntidadeRelacionamentoListParticipacaoEntidadeRelacionamentoToAttach.getClass(), participacaoEntidadeRelacionamentoListParticipacaoEntidadeRelacionamentoToAttach.getPapel());
                attachedParticipacaoEntidadeRelacionamentoList.add(participacaoEntidadeRelacionamentoListParticipacaoEntidadeRelacionamentoToAttach);
            }
            relacionamento.setParticipacaoEntidadeRelacionamentoList(attachedParticipacaoEntidadeRelacionamentoList);
            em.persist(relacionamento);
            for (Tabela tabelaListTabela : relacionamento.getTabelaList()) {
                tabelaListTabela.getRelacionamentoList().add(relacionamento);
                tabelaListTabela = em.merge(tabelaListTabela);
            }
            for (DicionarioMER dicionarioMERListDicionarioMER : relacionamento.getDicionarioMERList()) {
                dicionarioMERListDicionarioMER.getRelacionamentoList().add(relacionamento);
                dicionarioMERListDicionarioMER = em.merge(dicionarioMERListDicionarioMER);
            }
            for (AssociacaoRelacionamentoAtributo associacaoRelacionamentoAtributoListAssociacaoRelacionamentoAtributo : relacionamento.getAssociacaoRelacionamentoAtributoList()) {
                Relacionamento oldNomerelacionamentoOfAssociacaoRelacionamentoAtributoListAssociacaoRelacionamentoAtributo = associacaoRelacionamentoAtributoListAssociacaoRelacionamentoAtributo.getNomerelacionamento();
                associacaoRelacionamentoAtributoListAssociacaoRelacionamentoAtributo.setNomerelacionamento(relacionamento);
                associacaoRelacionamentoAtributoListAssociacaoRelacionamentoAtributo = em.merge(associacaoRelacionamentoAtributoListAssociacaoRelacionamentoAtributo);
                if (oldNomerelacionamentoOfAssociacaoRelacionamentoAtributoListAssociacaoRelacionamentoAtributo != null) {
                    oldNomerelacionamentoOfAssociacaoRelacionamentoAtributoListAssociacaoRelacionamentoAtributo.getAssociacaoRelacionamentoAtributoList().remove(associacaoRelacionamentoAtributoListAssociacaoRelacionamentoAtributo);
                    oldNomerelacionamentoOfAssociacaoRelacionamentoAtributoListAssociacaoRelacionamentoAtributo = em.merge(oldNomerelacionamentoOfAssociacaoRelacionamentoAtributoListAssociacaoRelacionamentoAtributo);
                }
            }
            for (ParticipacaoEntidadeRelacionamento participacaoEntidadeRelacionamentoListParticipacaoEntidadeRelacionamento : relacionamento.getParticipacaoEntidadeRelacionamentoList()) {
                Relacionamento oldNomerelacionamentoOfParticipacaoEntidadeRelacionamentoListParticipacaoEntidadeRelacionamento = participacaoEntidadeRelacionamentoListParticipacaoEntidadeRelacionamento.getNomerelacionamento();
                participacaoEntidadeRelacionamentoListParticipacaoEntidadeRelacionamento.setNomerelacionamento(relacionamento);
                participacaoEntidadeRelacionamentoListParticipacaoEntidadeRelacionamento = em.merge(participacaoEntidadeRelacionamentoListParticipacaoEntidadeRelacionamento);
                if (oldNomerelacionamentoOfParticipacaoEntidadeRelacionamentoListParticipacaoEntidadeRelacionamento != null) {
                    oldNomerelacionamentoOfParticipacaoEntidadeRelacionamentoListParticipacaoEntidadeRelacionamento.getParticipacaoEntidadeRelacionamentoList().remove(participacaoEntidadeRelacionamentoListParticipacaoEntidadeRelacionamento);
                    oldNomerelacionamentoOfParticipacaoEntidadeRelacionamentoListParticipacaoEntidadeRelacionamento = em.merge(oldNomerelacionamentoOfParticipacaoEntidadeRelacionamentoListParticipacaoEntidadeRelacionamento);
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            if (findRelacionamento(relacionamento.getNome()) != null) {
                throw new PreexistingEntityException("Relacionamento " + relacionamento + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Relacionamento relacionamento) throws IllegalOrphanException, NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Relacionamento persistentRelacionamento = em.find(Relacionamento.class, relacionamento.getNome());
            List<Tabela> tabelaListOld = persistentRelacionamento.getTabelaList();
            List<Tabela> tabelaListNew = relacionamento.getTabelaList();
            List<DicionarioMER> dicionarioMERListOld = persistentRelacionamento.getDicionarioMERList();
            List<DicionarioMER> dicionarioMERListNew = relacionamento.getDicionarioMERList();
            List<AssociacaoRelacionamentoAtributo> associacaoRelacionamentoAtributoListOld = persistentRelacionamento.getAssociacaoRelacionamentoAtributoList();
            List<AssociacaoRelacionamentoAtributo> associacaoRelacionamentoAtributoListNew = relacionamento.getAssociacaoRelacionamentoAtributoList();
            List<ParticipacaoEntidadeRelacionamento> participacaoEntidadeRelacionamentoListOld = persistentRelacionamento.getParticipacaoEntidadeRelacionamentoList();
            List<ParticipacaoEntidadeRelacionamento> participacaoEntidadeRelacionamentoListNew = relacionamento.getParticipacaoEntidadeRelacionamentoList();
            List<String> illegalOrphanMessages = null;
            
            if( associacaoRelacionamentoAtributoListOld !=null)
            for (AssociacaoRelacionamentoAtributo associacaoRelacionamentoAtributoListOldAssociacaoRelacionamentoAtributo : associacaoRelacionamentoAtributoListOld) {
                if (!associacaoRelacionamentoAtributoListNew.contains(associacaoRelacionamentoAtributoListOldAssociacaoRelacionamentoAtributo)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain AssociacaoRelacionamentoAtributo " + associacaoRelacionamentoAtributoListOldAssociacaoRelacionamentoAtributo + " since its nomerelacionamento field is not nullable.");
                }
            }
            
            if( participacaoEntidadeRelacionamentoListOld !=null)
            for (ParticipacaoEntidadeRelacionamento participacaoEntidadeRelacionamentoListOldParticipacaoEntidadeRelacionamento : participacaoEntidadeRelacionamentoListOld) {
                if (!participacaoEntidadeRelacionamentoListNew.contains(participacaoEntidadeRelacionamentoListOldParticipacaoEntidadeRelacionamento)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain ParticipacaoEntidadeRelacionamento " + participacaoEntidadeRelacionamentoListOldParticipacaoEntidadeRelacionamento + " since its nomerelacionamento field is not nullable.");
                }
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            List<Tabela> attachedTabelaListNew = new ArrayList<Tabela>();
            
            if( tabelaListNew !=null)
            for (Tabela tabelaListNewTabelaToAttach : tabelaListNew) {
                tabelaListNewTabelaToAttach = em.getReference(tabelaListNewTabelaToAttach.getClass(), tabelaListNewTabelaToAttach.getNome());
                attachedTabelaListNew.add(tabelaListNewTabelaToAttach);
            }
            tabelaListNew = attachedTabelaListNew;
            relacionamento.setTabelaList(tabelaListNew);
            List<DicionarioMER> attachedDicionarioMERListNew = new ArrayList<DicionarioMER>();
            
            if( dicionarioMERListNew !=null)
            for (DicionarioMER dicionarioMERListNewDicionarioMERToAttach : dicionarioMERListNew) {
                dicionarioMERListNewDicionarioMERToAttach = em.getReference(dicionarioMERListNewDicionarioMERToAttach.getClass(), dicionarioMERListNewDicionarioMERToAttach.getId());
                attachedDicionarioMERListNew.add(dicionarioMERListNewDicionarioMERToAttach);
            }
            dicionarioMERListNew = attachedDicionarioMERListNew;
            relacionamento.setDicionarioMERList(dicionarioMERListNew);
            List<AssociacaoRelacionamentoAtributo> attachedAssociacaoRelacionamentoAtributoListNew = new ArrayList<AssociacaoRelacionamentoAtributo>();
           
            if( associacaoRelacionamentoAtributoListNew !=null)
            for (AssociacaoRelacionamentoAtributo associacaoRelacionamentoAtributoListNewAssociacaoRelacionamentoAtributoToAttach : associacaoRelacionamentoAtributoListNew) {
                associacaoRelacionamentoAtributoListNewAssociacaoRelacionamentoAtributoToAttach = em.getReference(associacaoRelacionamentoAtributoListNewAssociacaoRelacionamentoAtributoToAttach.getClass(), associacaoRelacionamentoAtributoListNewAssociacaoRelacionamentoAtributoToAttach.getCodigo());
                attachedAssociacaoRelacionamentoAtributoListNew.add(associacaoRelacionamentoAtributoListNewAssociacaoRelacionamentoAtributoToAttach);
            }
            associacaoRelacionamentoAtributoListNew = attachedAssociacaoRelacionamentoAtributoListNew;
            relacionamento.setAssociacaoRelacionamentoAtributoList(associacaoRelacionamentoAtributoListNew);
            List<ParticipacaoEntidadeRelacionamento> attachedParticipacaoEntidadeRelacionamentoListNew = new ArrayList<ParticipacaoEntidadeRelacionamento>();
            
            if( participacaoEntidadeRelacionamentoListNew !=null)
            for (ParticipacaoEntidadeRelacionamento participacaoEntidadeRelacionamentoListNewParticipacaoEntidadeRelacionamentoToAttach : participacaoEntidadeRelacionamentoListNew) {
                participacaoEntidadeRelacionamentoListNewParticipacaoEntidadeRelacionamentoToAttach = em.getReference(participacaoEntidadeRelacionamentoListNewParticipacaoEntidadeRelacionamentoToAttach.getClass(), participacaoEntidadeRelacionamentoListNewParticipacaoEntidadeRelacionamentoToAttach.getPapel());
                attachedParticipacaoEntidadeRelacionamentoListNew.add(participacaoEntidadeRelacionamentoListNewParticipacaoEntidadeRelacionamentoToAttach);
            }
            participacaoEntidadeRelacionamentoListNew = attachedParticipacaoEntidadeRelacionamentoListNew;
            relacionamento.setParticipacaoEntidadeRelacionamentoList(participacaoEntidadeRelacionamentoListNew);
            relacionamento = em.merge(relacionamento);
            
            if( tabelaListOld !=null)
            for (Tabela tabelaListOldTabela : tabelaListOld) {
                if (!tabelaListNew.contains(tabelaListOldTabela)) {
                    tabelaListOldTabela.getRelacionamentoList().remove(relacionamento);
                    tabelaListOldTabela = em.merge(tabelaListOldTabela);
                }
            }

            if( tabelaListNew !=null)
            for (Tabela tabelaListNewTabela : tabelaListNew) {
                if (!tabelaListOld.contains(tabelaListNewTabela)) {
                    tabelaListNewTabela.getRelacionamentoList().add(relacionamento);
                    tabelaListNewTabela = em.merge(tabelaListNewTabela);
                }
            }
            
            if( dicionarioMERListOld !=null)
            for (DicionarioMER dicionarioMERListOldDicionarioMER : dicionarioMERListOld) {
                if (!dicionarioMERListNew.contains(dicionarioMERListOldDicionarioMER)) {
                    dicionarioMERListOldDicionarioMER.getRelacionamentoList().remove(relacionamento);
                    dicionarioMERListOldDicionarioMER = em.merge(dicionarioMERListOldDicionarioMER);
                }
            }
            
            if( dicionarioMERListNew !=null)
            for (DicionarioMER dicionarioMERListNewDicionarioMER : dicionarioMERListNew) {
                if (!dicionarioMERListOld.contains(dicionarioMERListNewDicionarioMER)) {
                    dicionarioMERListNewDicionarioMER.getRelacionamentoList().add(relacionamento);
                    dicionarioMERListNewDicionarioMER = em.merge(dicionarioMERListNewDicionarioMER);
                }
            }
            
            if( associacaoRelacionamentoAtributoListNew !=null)
            for (AssociacaoRelacionamentoAtributo associacaoRelacionamentoAtributoListNewAssociacaoRelacionamentoAtributo : associacaoRelacionamentoAtributoListNew) {
                if (!associacaoRelacionamentoAtributoListOld.contains(associacaoRelacionamentoAtributoListNewAssociacaoRelacionamentoAtributo)) {
                    Relacionamento oldNomerelacionamentoOfAssociacaoRelacionamentoAtributoListNewAssociacaoRelacionamentoAtributo = associacaoRelacionamentoAtributoListNewAssociacaoRelacionamentoAtributo.getNomerelacionamento();
                    associacaoRelacionamentoAtributoListNewAssociacaoRelacionamentoAtributo.setNomerelacionamento(relacionamento);
                    associacaoRelacionamentoAtributoListNewAssociacaoRelacionamentoAtributo = em.merge(associacaoRelacionamentoAtributoListNewAssociacaoRelacionamentoAtributo);
                    if (oldNomerelacionamentoOfAssociacaoRelacionamentoAtributoListNewAssociacaoRelacionamentoAtributo != null && !oldNomerelacionamentoOfAssociacaoRelacionamentoAtributoListNewAssociacaoRelacionamentoAtributo.equals(relacionamento)) {
                        oldNomerelacionamentoOfAssociacaoRelacionamentoAtributoListNewAssociacaoRelacionamentoAtributo.getAssociacaoRelacionamentoAtributoList().remove(associacaoRelacionamentoAtributoListNewAssociacaoRelacionamentoAtributo);
                        oldNomerelacionamentoOfAssociacaoRelacionamentoAtributoListNewAssociacaoRelacionamentoAtributo = em.merge(oldNomerelacionamentoOfAssociacaoRelacionamentoAtributoListNewAssociacaoRelacionamentoAtributo);
                    }
                }
            }
            
            if( participacaoEntidadeRelacionamentoListNew !=null)
            for (ParticipacaoEntidadeRelacionamento participacaoEntidadeRelacionamentoListNewParticipacaoEntidadeRelacionamento : participacaoEntidadeRelacionamentoListNew) {
                if (!participacaoEntidadeRelacionamentoListOld.contains(participacaoEntidadeRelacionamentoListNewParticipacaoEntidadeRelacionamento)) {
                    Relacionamento oldNomerelacionamentoOfParticipacaoEntidadeRelacionamentoListNewParticipacaoEntidadeRelacionamento = participacaoEntidadeRelacionamentoListNewParticipacaoEntidadeRelacionamento.getNomerelacionamento();
                    participacaoEntidadeRelacionamentoListNewParticipacaoEntidadeRelacionamento.setNomerelacionamento(relacionamento);
                    participacaoEntidadeRelacionamentoListNewParticipacaoEntidadeRelacionamento = em.merge(participacaoEntidadeRelacionamentoListNewParticipacaoEntidadeRelacionamento);
                    if (oldNomerelacionamentoOfParticipacaoEntidadeRelacionamentoListNewParticipacaoEntidadeRelacionamento != null && !oldNomerelacionamentoOfParticipacaoEntidadeRelacionamentoListNewParticipacaoEntidadeRelacionamento.equals(relacionamento)) {
                        oldNomerelacionamentoOfParticipacaoEntidadeRelacionamentoListNewParticipacaoEntidadeRelacionamento.getParticipacaoEntidadeRelacionamentoList().remove(participacaoEntidadeRelacionamentoListNewParticipacaoEntidadeRelacionamento);
                        oldNomerelacionamentoOfParticipacaoEntidadeRelacionamentoListNewParticipacaoEntidadeRelacionamento = em.merge(oldNomerelacionamentoOfParticipacaoEntidadeRelacionamentoListNewParticipacaoEntidadeRelacionamento);
                    }
                }
            }
            em.getTransaction().commit();
            
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                String id = relacionamento.getNome();
                if (findRelacionamento(id) == null) {
                    throw new NonexistentEntityException("The relacionamento with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(String id) throws IllegalOrphanException, NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Relacionamento relacionamento;
            try {
                relacionamento = em.getReference(Relacionamento.class, id);
                relacionamento.getNome();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The relacionamento with id " + id + " no longer exists.", enfe);
            }
            List<String> illegalOrphanMessages = null;
            List<AssociacaoRelacionamentoAtributo> associacaoRelacionamentoAtributoListOrphanCheck = relacionamento.getAssociacaoRelacionamentoAtributoList();
            for (AssociacaoRelacionamentoAtributo associacaoRelacionamentoAtributoListOrphanCheckAssociacaoRelacionamentoAtributo : associacaoRelacionamentoAtributoListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Relacionamento (" + relacionamento + ") cannot be destroyed since the AssociacaoRelacionamentoAtributo " + associacaoRelacionamentoAtributoListOrphanCheckAssociacaoRelacionamentoAtributo + " in its associacaoRelacionamentoAtributoList field has a non-nullable nomerelacionamento field.");
            }
            List<ParticipacaoEntidadeRelacionamento> participacaoEntidadeRelacionamentoListOrphanCheck = relacionamento.getParticipacaoEntidadeRelacionamentoList();
            for (ParticipacaoEntidadeRelacionamento participacaoEntidadeRelacionamentoListOrphanCheckParticipacaoEntidadeRelacionamento : participacaoEntidadeRelacionamentoListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Relacionamento (" + relacionamento + ") cannot be destroyed since the ParticipacaoEntidadeRelacionamento " + participacaoEntidadeRelacionamentoListOrphanCheckParticipacaoEntidadeRelacionamento + " in its participacaoEntidadeRelacionamentoList field has a non-nullable nomerelacionamento field.");
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            List<Tabela> tabelaList = relacionamento.getTabelaList();
            for (Tabela tabelaListTabela : tabelaList) {
                tabelaListTabela.getRelacionamentoList().remove(relacionamento);
                tabelaListTabela = em.merge(tabelaListTabela);
            }
            List<DicionarioMER> dicionarioMERList = relacionamento.getDicionarioMERList();
            for (DicionarioMER dicionarioMERListDicionarioMER : dicionarioMERList) {
                dicionarioMERListDicionarioMER.getRelacionamentoList().remove(relacionamento);
                dicionarioMERListDicionarioMER = em.merge(dicionarioMERListDicionarioMER);
            }
            em.remove(relacionamento);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Relacionamento> findRelacionamentoEntities() {
        return findRelacionamentoEntities(true, -1, -1);
    }

    public List<Relacionamento> findRelacionamentoEntities(int maxResults, int firstResult) {
        return findRelacionamentoEntities(false, maxResults, firstResult);
    }

    private List<Relacionamento> findRelacionamentoEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(Relacionamento.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Relacionamento findRelacionamento(String id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Relacionamento.class, id);
        } finally {
            em.close();
        }
    }

    public int getRelacionamentoCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<Relacionamento> rt = cq.from(Relacionamento.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    
}
